const fs = require('fs');
const path = require('path');
const { unzipFile } = require('./unzip');
const AdmZip = require('adm-zip');

/**
 * 运行测试套件
 */
async function runTests() {
    console.log('========== 开始测试解压程序 ==========');
    
    try {
        // 测试1: 基本解压功能
        console.log('\n----- 测试1: 基本解压功能 -----');
        let result = await unzipFile({
            origin: './target/3.0.15脉信升级包-250121.zip',
        });
        console.log(`测试1结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试2: 指定输出目录
        console.log('\n----- 测试2: 指定输出目录 -----');
        result = await unzipFile({
            origin: './target/sss.zip',
            dist: './output/test2'
        });
        console.log(`测试2结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试3: 强制创建文件夹
        console.log('\n----- 测试3: 强制创建文件夹 -----');
        result = await unzipFile({
            origin: './target/rpm.zip',
            dist: './output/test3',
            createFolder: true
        });
        console.log(`测试3结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试4: 不覆盖已存在的文件
        console.log('\n----- 测试4: 不覆盖已存在的文件 -----');
        // 先解压一次
        await unzipFile({
            origin: './target/sss.zip',
            dist: './output/test4'
        });
        // 再次解压，但不覆盖
        result = await unzipFile({
            origin: './target/sss.zip',
            dist: './output/test4',
            overwrite: false
        });
        console.log(`测试4结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试5: 设置自定义文件权限
        console.log('\n----- 测试5: 设置自定义文件权限 -----');
        result = await unzipFile({
            origin: './target/rpm.zip',
            dist: './output/test5',
            fileMode: {
                file: 0o600, // rw-------
                dir: 0o700   // rwx------
            }
        });
        console.log(`测试5结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试6: 使用默认权限777
        console.log('\n----- 测试6: 使用默认权限777 -----');
        result = await unzipFile({
            origin: './target/3.0.15脉信升级包-250121.zip',
            dist: './output/test6',
            // 使用默认的777权限
        });
        console.log(`测试6结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试7: 错误处理 - 不存在的文件
        console.log('\n----- 测试7: 错误处理 - 不存在的文件 -----');
        try {
            await unzipFile({
                origin: './target/not_exist.zip',
                dist: './output/test7'
            });
        } catch (err) {
            console.log(`测试7结果: 成功捕获错误 - ${err.message}`);
        }
        
        // 测试8: 错误处理 - 无效的ZIP文件
        console.log('\n----- 测试8: 错误处理 - 无效的ZIP文件 -----');
        // 创建一个无效的ZIP文件
        fs.writeFileSync('./target/invalid.zip', 'This is not a valid ZIP file');
        try {
            await unzipFile({
                origin: './target/invalid.zip',
                dist: './output/test8'
            });
        } catch (err) {
            console.log(`测试8结果: 成功捕获错误 - ${err.message}`);
        }
        
        // 测试9: 解压到只读目录
        console.log('\n----- 测试9: 解压到只读目录 -----');
        // 创建一个只读目录
        const readOnlyDir = './output/readonly';
        if (!fs.existsSync(readOnlyDir)) {
            fs.mkdirSync(readOnlyDir, { recursive: true });
        }
        
        if (process.platform !== 'win32') {
            // 在非Windows系统上设置目录为只读
            fs.chmodSync(readOnlyDir, 0o444);
        }
        
        try {
            await unzipFile({
                origin: './target/sss.zip',
                dist: readOnlyDir
            });
        } catch (err) {
            console.log(`测试9结果: 成功捕获错误 - ${err.message}`);
        } finally {
            // 恢复目录权限
            if (process.platform !== 'win32') {
                fs.chmodSync(readOnlyDir, 0o755);
            }
        }
        
        // 测试10: 解压空ZIP文件
        console.log('\n----- 测试10: 解压空ZIP文件 -----');
        // 创建一个空的ZIP文件
        const emptyZip = new AdmZip();
        emptyZip.writeZip('./target/empty.zip');
        
        result = await unzipFile({
            origin: './target/empty.zip',
            dist: './output/test10'
        });
        console.log(`测试10结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试11: 大文件使用子进程解压
        console.log('\n----- 测试11: 大文件使用子进程解压 -----');
        result = await unzipFile({
            origin: './target/3.0.15脉信升级包-250121.zip',
            dist: './output/test11',
            largeFileSizeThreshold: 0.01 // 设置一个很小的阈值，强制使用子进程
        });
        console.log(`测试11结果: 文件已解压到: ${result.outputDir}`);
        
        // 测试12: 中文文件名测试
        console.log('\n----- 测试12: 中文文件名测试 -----');
        // 创建一个包含中文文件名的ZIP
        const chineseZip = new AdmZip();
        chineseZip.addFile('中文文件.txt', Buffer.from('这是一个中文文件'));
        chineseZip.addFile('中文目录/测试.txt', Buffer.from('这是中文目录中的文件'));
        chineseZip.writeZip('./target/中文测试.zip');
        
        result = await unzipFile({
            origin: './target/中文测试.zip',
            dist: './output/test12'
        });
        console.log(`测试12结果: 文件已解压到: ${result.outputDir}`);
        
        console.log('\n========== 所有测试完成 ==========');
    } catch (err) {
        console.error('测试过程中出错:', err);
    }
}

// 运行测试套件
runTests(); 